﻿Public Class frmAutentificarCierreCaja

    Private Sub SimpleButton1_Click(sender As System.Object, e As System.EventArgs) Handles SimpleButton1.Click
        If SeguridadSGS.PermisosPorUsuario(My.Resources.SeguridadSGS.CierresCaja, usuario.Text, contrasena.Text) Then
            Try
                If FacturasTableAdapter1.Fill(DbFireAndIceDataSet1.facturas) Then
                    
                    Dim ticketinicial As Integer
                    ticketinicial = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MAX(numticketfinal) + 1 FROM cierrecaja WHERE nombrepc = '{0}' GROUP BY nombrepc", My.Computer.Name))
                    If ticketinicial = Nothing Then
                        ticketinicial = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MIN(numfactura) AS primerticket FROM facturas GROUP BY nombrepc HAVING nombrepc = '{0}'", My.Computer.Name))
                        If ticketinicial = Nothing Then
                            ticketinicial = ConexionSGS.EjecutarQueryScalar("SELECT MAX(numfactura) + 1 FROM facturas where numfactura is not null group by numfactura ORDER BY numfactura DESC")
                        End If
                    End If

                    Dim ticketfinal As Integer
                    ticketfinal = ConexionSGS.EjecutarQueryScalar("SELECT MAX(numfactura) FROM facturas where numfactura is not null group by numfactura ORDER BY numfactura DESC")
                    If ticketfinal = Nothing Then
                        ticketfinal = 1
                    End If

                    Dim totaltickets As Integer
                    totaltickets = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT COUNT(numfactura) FROM facturas WHERE nombrepc = '{0}' AND numfactura >= {1} AND numfactura <= {2} GROUP BY nombrepc", My.Computer.Name, ticketinicial, ticketfinal))
                    

                    'If ticketfinal - ticketinicial < 0 Then
                    If totaltickets <= 0 Then
                        MsgBox("No ha facturado desde el último cierre.", MsgBoxStyle.Critical, "Cierre de caja no está disponible")
                    Else
                        Dim pc As String = String.Format("'{0}'", My.Computer.Name) 'String.Format("{0}", My.Computer.Name)
                        Try
                            Dim iduser As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("select iduser from usuarios where nombreuser = '{0}'", usuario.Text))
                            Dim totalvendido As Double = ConexionSGS.EjecutarQueryScalar(String.Format("select sum(total) from facturas where numfactura >= {0} AND numfactura <= {1} AND nula = false AND nombrepc = {2};", Str(ticketinicial), Str(ticketfinal), pc))
                            ConexionSGS.EjecutarQueryNonQuery(String.Format("INSERT INTO cierrecaja (iduser, fecha, hora, idcierretipo, iduserautoriza, numticketinicial, numticketfinal, nombrepc, totaltickets, totalvendido) VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, '{7}', {8}, {9});", My.Forms.MDI.Iduser.Caption, "current_date", "current_time", 1, iduser, ticketinicial, ticketfinal, My.Computer.Name, totaltickets, totalvendido))

                            Dim idcierre As Integer = ConexionSGS.EjecutarQueryScalar("select max(idcierrecaja) from cierrecaja group by idcierrecaja order by idcierrecaja desc")
                            ConexionSGS.EjecutarQueryNonQuery(String.Format("select calcula_cierre_caja({0},{1},{2},{3});", Str(idcierre), Str(ticketinicial), Str(ticketfinal), pc))

                            Dim report As New rptCierre
                            report.VreportecierreTableAdapter.FillById(report.DbFireAndIceDataSet1.vreportecierre, idcierre)
                            Dim totalespago As Integer = report.VreportecierreTableAdapter.ScalarQueryObtieneTotalTiposPago(idcierre)
                            report.PageHeight = report.PageHeight + report.Bands(DevExpress.XtraReports.UI.BandKind.Detail).HeightF * (totalespago - 1)
                            report.Print()
                            'report.ShowPreview()
                        Catch ex As Exception
                            AlertControl1.AppearanceCaption.ForeColor = Color.Red
                            AlertControl1.Show(Me, "Error", "Ha ocurrido un error mientras se calculaba el cierre de caja.")
                            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en calculo de totalvendido y en la llamada al procedimiento calcula_cierre_caja() en ValidarUsuarioCierre.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
                        End Try

                        Dim reportmov As New rptMovimientos
                        If reportmov.MovimientoscajaTableAdapter.FillByRangoCierreCaja(reportmov.DbFireAndIceDataSet1.movimientoscaja, ticketinicial, ticketfinal, My.Computer.Name) Then
                            reportmov.VreportemovimientosTableAdapter1.FillByCaja(reportmov.DbFireAndIceDataSet1.vreportemovimientos, ticketinicial, ticketfinal, My.Computer.Name)
                            reportmov.MovimientoscajaTableAdapter.FillByRangoCierreCaja(reportmov.DbFireAndIceDataSet1.movimientoscaja, ticketinicial, ticketfinal, My.Computer.Name)
                            'reportmov.ShowPreview()
                            reportmov.Print()
                        Else
                            Dim reportevacio As New rptMovimientosVACIO
                            'reportevacio.ShowPreview()
                            reportevacio.Print()
                        End If

                        AlertControl1.AppearanceCaption.ForeColor = Color.Green
                        AlertControl1.Show(Me, "Notificación", "Se generó el cierre del día.")
                        My.Forms.frmFactura.cierrecaja = True
                        Windows.Forms.Application.ExitThread()
                    End If
                Else
                    MsgBox("No existen facturas en el sistema.", MsgBoxStyle.Critical, "Cierre de caja no está disponible")
                End If

            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "No se pudo generar el cierre del día.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Sentencia para generar el cierre del día en la pantalla de Facturas", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
            End Try
        Else
            MsgBox("El usuario no tiene permisos para realizar esta acción", MsgBoxStyle.Exclamation, "Notificación")
        End If
    End Sub

End Class